.\"
.\" UCSD p-System cross compiler
.\" Copyright (C) 2011, 2012 Peter Miller
.\"
.\" This program is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2 of the License, or (at
.\" you option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
.\" General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License along
.\" with this program. If not, see
Up | Next |
How do you share a single grammar amongst several tools that operate on the
same language?
| |
\&... systematically named functions. | \&... or methods. |
%right ASSIGN /* lowest precedence */ %left PLUS /* highest precedence */ |
%right ASSIGN /* lowest precedence */ %left PLUS /* highest precedence */ |
|
%{ translator *context; %} |
%% |
%% |
expression : IDENTIFIER { $$ = parse_expression_identifier($1); } | expression PLUS expression { $$ = parse_expression_addition($1, $3); } | expression ASSIGN expression { $$ = parse_expression_assignment($1, $3); } | etc etc ; |
expression : IDENTIFIER { $$ = context->expression_identifier($1); } | expression PLUS expression { $$ = context->expression_addition($1, $3); } | expression ASSIGN expression { $$ = context->expression_assignment($1, $3); } | etc etc ; |
Aha! What if the methods were virtual?
You get an AST factory abstraction you can share amongst tools: |
![]() |